lexer grammar AnalizadorYACCLexer;

options {
  language = Java;
}
@header {package  PL.practica7;}

@members{

public class PalabraReservada {
  int contador;
  String Palabra;
  
      public  PalabraReservada(){
        contador = 0;
        Palabra = "";
      }
  
      public void setPalabra (String s) {Palabra = s; contador++;}
      public String getPalabra () {return Palabra;}
      public int getContador () {return contador;}
      public void aumentarContador () {contador++;}
  
  }
  
  ArrayList <PalabraReservada> Reservadas = new ArrayList <PalabraReservada>();
  
  public void AñadirPalabra (String s){
       boolean dentroArray = false;
       PalabraReservada p = new PalabraReservada();
       p.setPalabra(s);
       for (int i = 0; i < Reservadas.size(); i++){
          if (s.equals(Reservadas.get(i).getPalabra())){
            Reservadas.get(i).aumentarContador();
            dentroArray = true;
            }

       }
        if (!dentroArray)
          Reservadas.add(p);
  }
  
  public void MostrarPalabras (){
      for (int i=0; i < Reservadas.size(); i++)
          System.out.println ("La palabra reservada "+ Reservadas.get(i).getPalabra()+ " aparece " + Reservadas.get(i).getContador());
        }
 

ArrayList <RecognitionException> errores = new ArrayList<RecognitionException>();

public boolean listaVacia (){
    if (errores.isEmpty()){
      return true;
    }else
      return false;
}


public ArrayList getListaErrores(){return errores;}


@Override
public void reportError (RecognitionException e){
  System.err.println (getErrorMessage(e, getTokenNames()));
  errores.add(e);
}

}


//PALABRAS RESERVADAS

  RETORNAR : {AñadirPalabra("return");} 'return';
  INT : {AñadirPalabra("int");}  'int';
  CHAR : {AñadirPalabra("char");} 'char';
  POINTER : {AñadirPalabra("pointer");} 'pointer';
  DOUBLE : {AñadirPalabra("double");}  'double';
  REGISTER : {AñadirPalabra("register");}  'register';
  VOID :  {AñadirPalabra("void");} 'void';
  PRINTF :  {AñadirPalabra("printf");} 'printf';
  INCLUDE :  {AñadirPalabra("include");} 'include';
  INTERVAL :  {AñadirPalabra("INTERVAL");} 'INTERVAL';
  WHILE :  {AñadirPalabra("while");} 'while';
  IF :  {AñadirPalabra("if");} 'if';
  ELSE :  {AñadirPalabra("else");} 'else';
  FOR :   {AñadirPalabra("for");}'for';
  TYPE :  {AñadirPalabra("type");} 'type';
  TYPEDEF : {AñadirPalabra("typedef");} 'typedef';
  STRUCT :  {AñadirPalabra("struct");} 'struct';
  DEFINE :  {AñadirPalabra("define");} 'define';
  TOKEN :  {AñadirPalabra("token");} 'token';
  LEFT :  {AñadirPalabra("left");} 'left';
  CONTINUE :  {AñadirPalabra("continue");}'continue';
  BREAK :  {AñadirPalabra("break");}'break';
  START :  {AñadirPalabra("start");} 'start';
  UNION :  {AñadirPalabra("union");} 'union';
  YYLEX :   {AñadirPalabra("yylex");}'yylex';
  
  //PARA FORMAR TOKEN MAS COMPLEJOS

  fragment LETRAMINUS : ('a'..'z'); 
  fragment LETRAMAYUS : ('A'..'Z'); 

  fragment NUEVA_LINEA: '\r\n' ;
  fragment DIGITO: '0'..'9';

  
 //TOKENS A FILTRAR 
  BLANCO: (' '|'\t'|NUEVA_LINEA) {skip();};
  COMENTARIO: '/*' (options {greedy=false;}:.)* '*/'{skip();};

  // SIMBOLOS
  OR : '|';
  AND : '&';
  ORLOGICO : '||';
  ANDLOGICO : '&&';
  ALMOHADILLA : '#';
  SEPARADOR: ';';
  DOSPUNTOS : ':';
  INCREMENTO : '++';
  DECREMENTO : '--';
  ASTERISCO: '*';
  COMA : ',';
  SLASHINVERTIDO : '\\';
  SLASH : '/';
  IGUAL : '=';
  COMPARACION : '==';
  ABRIRANGULO : '<';
  CERRARANGULO : '>';
  PORCENTAJE : '%';
  DOLLAR : '$';
  ABRIRCORCHETE : '[';
  CERRARCORCHETE : ']';
  ABRIRLLAVE : '{';
  CERRARLLAVE: '}';
  ABRIRPARENTESIS : '(';
  CERRARPARENTESIS : ')';
  PUNTO : '.';
    MAS : '+';
  MENOS : '-';
  
  //IDENTIFICADORES
  IDENTMAYUS : LETRAMAYUS+;
  IDENTMINUS : LETRAMINUS+;
  IDENT : (LETRAMAYUS|LETRAMINUS) (LETRAMAYUS|LETRAMINUS|DIGITO|PUNTO)*;


  
  //NUMEROS 
  NUMERO: (DIGITO)+('.'(DIGITO)+)?;
  
  //CADENAS
  CADENA : '"' (options {greedy=false;}:.)* '"';
  
  //CARACTETES
  CARACTER : '\'' SLASHINVERTIDO? (options{greedy = false;}:.) '\'';
 
  //OTROS PATRONES
  ABRIRVARIABLES : '%{';
  CERRARVARIABLES : '%}';
  SEPARADORBLOQUE : '%%';
  RANGO :  (DIGITO '-'DIGITO | LETRAMAYUS '-'LETRAMAYUS | LETRAMINUS '-' LETRAMINUS)+;
  //CORCHETES : ABRIRCORCHETE (RANGO |NUMERO|SIGNAL)? CERRARCORCHETE;
 
  // SEÑAL

SIGNAL : (PUNTO? DOLLAR (DOLLAR|DIGITO) (PUNTO IDENTMINUS)?);
